package innerclass;

/**
 * @author hht
 * @ClassName Outer
 * @Description
 * 总结：为了英文部分注释使用英文
 * 一：非静态内部类
 * 内部类调用外部类
 * 1.非静态内部类，不能存在静态方法
 * 2.非静态方法，调用外部类的非静态方法、静态方法都可以直接调用
 * 外部类调用内部类
 * 1.非静态方法，调用内部的非静态方法 new Inner().innerMethod();
 * 2.静态方法，调用内部类的非静态方法 new Outer().new Inner().innerMethod();
 * 二：静态内部类
 * 内部类调用外部类
 * 1.非静态、静态方法，调用静态方法直接调用
 * 2.非静态、静态方法，调用非静态方法 new Outer().outMethod();
 * 外部类调用内部类
 * 1.非静态、静态方法，调用非静态方法 new Outer.StaticInner().innerMethod();
 * 2.非静态、静态方法，调用静态方法 Outer.StaticInner.innerStaticMethod();
 * @Date 2019/7/2 21:50
 * @VERSION 1.0
 */
public class Outer {
    private void outMethod(){
        System.out.println("i am out non-static method");
        new Inner().innerMethod();
        new Outer.StaticInner().innerMethod();
        Outer.StaticInner.innerStaticMethod();
    }
    private static void outStaticMethod(){
        System.out.println("i am out static method");
        new Outer().new Inner().innerMethod();
        new Outer.StaticInner().innerMethod();
        Outer.StaticInner.innerStaticMethod();
    }
    class Inner{
        private void innerMethod(){
            System.out.println("i am inner non-static method");
            outMethod();
            outStaticMethod();
        }


//        //error non-static class canot have static cmethod
//        private static void innerStaticMethod(){
//            System.out.println("i am inner static method");
//        }
    }
    static class StaticInner{
        private void innerMethod(){
            System.out.println("i am staticinner non-static method");
            outStaticMethod();
            new Outer().outMethod();
        }

        private static void innerStaticMethod(){
            System.out.println("i am staticinner static method");
            outStaticMethod();
            new Outer().outMethod();
        }
    }
}